class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        unordered_map<int, vector<int>> edges; // 领接表
        vector<int> in(numCourses, 0); // 存储每一个结点的入度
        for(auto& e : prerequisites) // 1. 建图
        {
            int a = e[0], b = e[1];; // b指向a
            edges[b].push_back(a);
            in[a]++;
        }
 
        queue<int> q; // 2. BFS解决拓扑排序
        for(int i = 0; i < numCourses; ++i)
        {
            if(in[i] == 0)
                q.push(i);
        }
        while(!q.empty()) // 层序遍历
        {
            int tmp = q.front();
            q.pop();
            for(auto& e : edges[tmp]) // 得到tmp指向的顶点, 删掉一个入度
            {
                in[e]--;
                if(in[e] == 0)
                    q.push(e);
            }
        }
        for(auto& e : in) // 3. 判断是否有环
        {
            if(e != 0)
                return false;
        }
        return true;
    }
};